#include<stdio.h>

/*																				realloc函数
函数概要：
	用于重新分配内存。
	它接受两个参数，即一个先前分配的指针和一个新的内存大小，然后尝试重新调整先前分配的内存块的大小。
	如果调整成功，它将返回一个指向重新分配内存的指针，否则返回一个空指针。	

	1. realloc 函数修改 ptr 指向的内存空间大小为 size 字节。
	2. 如果新分配的内存空间比原来的大，则旧内存块的数据不会发生改变；如果新的内存空间大小小于旧的内存空间，可能会导致数据丢失，慎用！
	3. 该函数将移动内存空间的数据并返回新的指针。
	4. 如果 ptr 参数为 NULL，那么调用该函数就相当于调用 malloc(size)。
	5. 如果 size 参数为 0，并且 ptr 参数不为 NULL，那么调用该函数就相当于调用 free(ptr)。
	6. 除非 ptr 参数为 NULL，否则 ptr 的值必须由先前调用 malloc、calloc 或 realloc 函数返回。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

函数原型：
	#include <stdlib.h>
	...
	void *realloc(void *ptr, size_t size) 

	参数分析：
	参数								含义
	ptr								1. 指向由先前调用 malloc、calloc 或 realloc 函数返回的内存空间。2. 如果该参数为 NULL，相当于调用 malloc(size) 函数
	size							指定新的内存块大小，以字节为单位

	//用法： 指针名=（数据类型*）realloc（要改变内存大小的指针名，新的大小）

	返回值：

	1. 如果函数调用成功，返回值是指向新的内存空间的指针，由于返回类型是 void 指针（void *），所以它可以被转换成任何类型的数据。
	2. 如果函数调用失败，返回值是 NULL。
	3. 如果 size 参数设置为 0，返回值也可能是 NULL，也可能返回一个指针值，稍后可以传递给 free 函数。
	4. 如果 realloc 函数调用失败，那么原始内存空间的数据并不会修改，也不会被释放或移动。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

核心功能:
	·重新分配内存：调整由 malloc、calloc 或 realloc 分配的 ptr 指向的内存块大小[1][5]。若 ptr 为 NULL，则其行为等同于 malloc(new_size)，分配新内存块[2][4]。

	·内存块扩展/收缩：
	当原内存块后方有足够连续空间时，直接扩展内存块并返回原指针。
	当空间不足时，分配新内存块并复制原数据，释放旧内存块后返回新指针。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

关键特性：
	1.原地扩展优化：若内存块后续空间允许，直接扩展以避免数据复制。

	2.内存块移动：新内存块地址可能变化，必须使用返回值更新指针，否则可能导致内存泄漏或悬空指针。

	零长度处理：
	1.当 size=0 时，可能释放原内存块并返回 NULL;

	2.部分实现,会释放原内存块并返回 NULL

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

注意事项：
	合法性要求：ptr 必须是先前由内存分配函数返回的有效指针（未释放），否则行为未定义。

	内存泄漏风险：若未保存原指针，重新分配失败时将无法释放旧内存块。

	多次调用开销：频繁调整可能导致内存碎片化，影响性能。

	线程安全：函数本身线程安全，但需同步对同一内存块的操作。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

*/


#include<stdio.h>
#include<stdlib.h>

int main(void)
{
	int i, num;
	int count = 0;

	int* ptr = NULL;

	do {
		printf("请输入一个整数(以-1为结束):");
		scanf("%d", &num);
		count++;

		ptr = (int*)realloc(ptr, count * sizeof(int)); //指针名 = （数据类型 * ）realloc（要改变内存大小的指针名，新的大小）
		if (ptr == NULL)
		{
			exit(1);
		}

		ptr[count - 1] = num;

	} while (num != -1);
	printf("你输入的整数分别是：");
	for (int i = 0; i < count - 1; i++)
	{
		printf("%d ", ptr[i]);
	}
	free(ptr);

	return 0;
}